/*
 * @Author: your name
 * @Date: 2020-08-12 21:18:34
 * @LastEditTime: 2020-08-12 21:48:41
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \day01\traning\test06\main.go
 */
package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"time"
)

// 问哦
func Read() {
	file, err := os.Open("./main.go")
	defer file.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
	var buf = make([]byte, 128)
	var content []byte
	for {
		n, err := file.Read(buf)
		if err != nil {
			if err == io.EOF {
				fmt.Println("文件读取完了")
				break
			}
			fmt.Println(err)
			return
		}
		time.Sleep(1 * time.Millisecond)
		content = append(content, buf[:n]...)
	}
	fmt.Println(string(content))
}

// 使用bufio来读取文件
func bufioRead() {
	file, err := os.Open("./main.go")
	if err != nil {
		fmt.Println(err)
		return
	}

	defer file.Close()
	reader := bufio.NewReader(file)
	for {
		// 读取的是字节，\n为换行，然后继续读取
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			// 判断是否读取到错误信息
			if len(line) != 0 {
				fmt.Println(line)
			}
			fmt.Println("读完了")
			break
		}
		// 判断是否遇到了错误
		if err != nil {
			fmt.Println(err)
			return
		}
		// 打印每一行读取的信息
		fmt.Println(line)
	}

}

// 读取整个文件/读取小文件可以使用，如果是大文件的话不建议
func ioutilRead() {
	file, err := ioutil.ReadFile("./main.go")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(file))
}

func write() {
	file, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}

	defer file.Close()
	str1 := "hahaham水电费"
	file.Write([]byte(str1)) // 直接写入byte二进制 类型，二进制类型的话是一个切片
	file.WriteString("哈哈")   // 直接写入string
}

func bufioWrite() {
	file, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

	writer := bufio.NewWriter(file)
	for i := 0; i < 10; i++ {
		writer.WriteString("你是谁\n") // 现将数据写入缓存
	}
	writer.Flush() // 将缓存写入文件
}

func ioutilWrite() {
	str := "haha"
	err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
}

func main() {
	// bufioRead()  // 文件缓存读取
	// ioutilRead() // 整个文件读取
	// write() 	// 文件写入
	// bufioWrite()
	// ioutilWrite()
}
